﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace MedicalAssistant.core
{

    [Serializable]
    public class Consulta
    {
        public enum TipoDeConsulta
        {
            Retorno,
            PrimeiraCosulta
        } ;

        private DateTime dataDaCosulta;
        private TipoDeConsulta tipo;
        private int pontuacao;
        private double pesoEmQuilos;
        private double alturaEmCentimetros;
        private Receita receita;

        private int quadroClinico;
        private int quadroRadiologico;
        private int contatoComAdultoTB;
        private int vacinacaoBCG;
        private int estadoNutricional;

        public Consulta(double alturaEmCentimetros, double pesoEmQuilos, TipoDeConsulta tipo)
        {
            this.AlturaEmCentimetros = alturaEmCentimetros;
            this.dataDaCosulta = DateTime.Today;
            this.PesoEmQuilos = pesoEmQuilos;
            this.tipo = tipo;
        }

        public Receita GerarReceita(Receita.TipoDaReceita tipoDaReceita)
        {
            if(this.TotalPontos() < 30)
            {
                throw new ExcecaoDoSistema("Impossível gerar Receita para Criança sem Tuberculose!");
            }
            
            this.receita = new Receita(tipoDaReceita, this.PesoEmQuilos);
            return this.receita;
        }

        public Receita Receita
        {
            get { return receita; }
            set { receita = value; }
        }

        public DateTime DataDaCosulta
        {
            get { return dataDaCosulta; }
            set { dataDaCosulta = value; }
        }

        public TipoDeConsulta Tipo
        {
            get { return tipo; }
            set { tipo = value; }
        }

        public int Pontuacao
        {
            get { return pontuacao; }
            set { pontuacao = value; }
        }

        public double PesoEmQuilos
        {
            get { return pesoEmQuilos; }
            set
            {
                if (value <= 0)
                {
                    throw new ExcecaoDoSistema("Peso inválida.");
                }

                pesoEmQuilos = value;
            }
        }

        public double AlturaEmCentimetros
        {
            get { return alturaEmCentimetros; }
            set
            {
                if (value <= 0)
                {
                    throw new ExcecaoDoSistema("Altura inválida.");
                }

                alturaEmCentimetros = value;
            }
        }

        public int QuadroClinico(Questionario.Escolha2 tosse, Questionario.Escolha2 febre, Questionario.Escolha2 adinamia, Questionario.Escolha2 expectoracao,
            Questionario.Escolha2 emagrecimento, Questionario.Escolha2 sudorese, uint duracaoSintomas, Questionario.Escolha3 infeccaoRespiratoria, Questionario.Escolha4 melhorouComAntibioticos, Questionario.Escolha1 assintomatico)
        {
            this.quadroClinico = Questionario.QuadroClinico(tosse, febre, adinamia, expectoracao, emagrecimento, sudorese, duracaoSintomas,
                                       infeccaoRespiratoria, melhorouComAntibioticos, assintomatico);
            return this.quadroClinico;
        }


        //TODO Consertar aqui!
        public int QuadroRadiologico(Questionario.Escolha1 rxNormal)
        {
            return 0;
        }

        public int ContatoComAdultoTuberculoso(Questionario.Escolha2 contatoComAdultoTB, Questionario.Escolha5 qualAdultoTB, Questionario.Escolha2 proximoNosUltimos2Anos, Questionario.Escolha2 ocasionalOuNegativo)
        {
            this.contatoComAdultoTB = Questionario.ContatoComAdultoTuberculoso(contatoComAdultoTB, qualAdultoTB, proximoNosUltimos2Anos,
                                                     ocasionalOuNegativo);
            return this.contatoComAdultoTB;
        }

        public int Vacinacao(Questionario.Escolha2 vacinacaoBCG, Questionario.Escolha6 tempoBCG, uint testeTuberculinicoEmMM)
        {
            this.vacinacaoBCG = Questionario.Vacinacao(vacinacaoBCG, tempoBCG, testeTuberculinicoEmMM);
            return this.vacinacaoBCG;
        }

        public int EstadoNutricional(Questionario.Escolha1 desnutricaoGraveOuAbaixoP10)
        {
            this.estadoNutricional = Questionario.EstadoNutricional(desnutricaoGraveOuAbaixoP10);
            return this.estadoNutricional;
        }

        public int TotalPontos()
        {
            return this.quadroClinico + this.quadroRadiologico + this.vacinacaoBCG + this.estadoNutricional +
                   this.contatoComAdultoTB;
        }

    }
}
